package com.lpf.nio2;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

// AcceptHandler 类实现了 CompletionHandler 接口的 completed 方法。它还有两个模板参数，第一个是异步通道，第二个就是 Nio2Server 本身
public class AcceptHandler implements CompletionHandler<AsynchronousSocketChannel, Nio2Server> {

    // 具体处理连接请求的就是 completed 方法，它有两个参数：第一个是异步通道，第二个就是上面传入的 NioServer 对象
    @Override
    public void completed(AsynchronousSocketChannel asc, Nio2Server attachment) {
        // 调用 accept 方法继续接收其他客户端的请求
        attachment.assoc.accept(attachment, this);

        //1. 先分配好 Buffer，告诉内核，数据拷贝到哪里去
        ByteBuffer buf = ByteBuffer.allocate(1024);

        //2. 调用 read 函数读取数据，除了把 buf 作为参数传入，还传入读回调类
        asc.read(buf, buf, new ReadHandler());

    }

    @Override
    public void failed(Throwable exc, Nio2Server attachment) {

    }
}